import Mock from "mockjs";
import qs from "qs";
import withCredentials from "./patch/withCredentials";

/* 补丁 */
withCredentials(Mock);

/* Mock 默认配置 */
Mock.setup({ timeout: "200-300" });

/* 扩展 [生成器] */
const Generator = (prop, template) => {
  const obj = {};
  obj[prop] = [template];
  return Mock.mock(obj);
};

/* 扩展 [循环] */
const Repeat = (num, itemTemplate) =>
  Generator(`data|${num}`, itemTemplate).data;

const CustomExtends = {
  Generator,
  Repeat,
  Mock,
  Random: Mock.Random
};

const extend = (prop, value) => {
  CustomExtends[prop] = value;
};

/* 装配配置组 */
const wired = ({ url, type, body }) => ({
  method: type,
  params: qs.parse(url.split("?").length > 1 ? url.split("?")[1] : ""),
  body: JSON.parse(body),
  url: qs.parse(url.split("?")[0]),
  ...CustomExtends
});

const setup = (path, method, handle) => {
  Mock.mock(
    RegExp(path),
    method,
    typeof handle === "function" ? o => handle(wired(o)) : handle
  );
};

const load = collection => {
  collection.map(({ path, method, handle }) => {
    if (method === "*") {
      method = [
        "get",
        "head",
        "post",
        "put",
        "delete",
        "connect",
        "options",
        "trace",
        "patch"
      ];
    }
    if (typeof method === "string" && method.indexOf("|") > -1)
      method = method.split("|");
    if (method instanceof Array) {
      method.map(item => setup(path, item, handle));
    } else {
      setup(path, method, handle);
    }
  });
};

export default { setup, load, extend };
